几年前写的15W系列解码38K NEC协议红外遥控12864液晶屏程序供参考:
串口程序参考:https://www.stcaimcu.com/thread-16321-1-1.html
- #include <STC15F2K60S2.H>
- #include <intrins.h>
- #define RXD P30
- #define TXD P31
- #define IRIN P32
- #define Buzzer P33 //定义蜂鸣器IO口
- #define LCD12864_SID P34 //定义LCD12864时钟IO口
- #define LCD12864_SCLK P35 //定义LCD12864数据IO口
- #define Write_Command 0xf8
- #define Write_Data 0xfa
- #define Read_Command 0xfc
- #define Read_Data 0xfe
- #define Setting_Basic_Instruction_Set 0x30
- #define Setting_Extended_Instruction_Set_Drawing_Off 0x34
- #define Setting_Extended_Instruction_Set_Drawing_On 0x36
- #define Clear_Display 0x01
- #define Entry_Mode_Cursor_Left 0x04
- #define Entry_Mode_Entire_Right 0x05
- #define Entry_Mode_Cursor_Right 0x06
- #define Entry_Mode_Entire_Left 0x07
- #define Display_Off 0x08
- #define Display_On_Cursor_Off_Inverse_Off 0x0c
- #define Display_On_Cursor_Off_Inverse_On 0x0d
- #define Display_On_Cursor_On_Inverse_Off 0x0e
- #define Display_On_Cursor_On_Inverse_On 0x0f
- #define Cursor_Move_Left 0x10
- #define Cursor_Move_Right 0x14
- #define Display_Move_Left 0x18
- #define Display_Move_Right 0x1c
- bit Error_Flag;
- unsigned char ms_50,Temp_Second,Temp;
- unsigned char IRCOM[4];
- unsigned char code Display_Hex[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
- unsigned char code Display_Data1[64]=
- {
- " 红外遥控解码 " //0x80
- " IR_Code: " //0x90
- " " //0x88
- " " //0x98
- };
-
- /*----------------------------延时10us@STC-Y5@11.0592MHz----------------------------*/
- void Delay_10us(void)
- {
- unsigned char i;
- _nop_();
- _nop_();
- i=25;
- while(--i);
- }
-
- /*----------------------------延时x10us----------------------------*/
- void Delay_x10us(unsigned char x)
- {
- while(x--)
- Delay_10us();
- }
-
- /*----------------------------延时10ms@STC-Y5@11.0592MHz----------------------------*/
- void Delay_10ms(void)
- {
- unsigned char i,j;
- i=108;
- j=145;
- do
- {
- while(--j);
- }while(--i);
- }
-
- /*----------------------------延时140us@STC-Y5@11.0592MHz----------------------------*/
- void Delay_140us(void)
- {
- unsigned char i,j;
- i=2;
- j=126;
- do
- {
- while(--j);
- }
- while(--i);
- }
-
- void Delay_x140us(unsigned char x)
- {
- while(x--)
- Delay_140us();
- }
-
- /*----------------------------写1字节命令或数据----------------------------*/
- void LCD12864_Write_Byte(unsigned char temp)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if((temp<<i)&0x80)
- LCD12864_SID=1;
- else
- LCD12864_SID=0;
- LCD12864_SCLK=0;
- LCD12864_SCLK=1;
- }
- }
-
- /*----------------------------传送数据或者命令----------------------------*/
- void LCD12864_Write(unsigned char Command,unsigned char temp)
- {
- LCD12864_Write_Byte(Command);
- LCD12864_Write_Byte(temp&0xf0);
- LCD12864_Write_Byte((temp<<4)&0xf0);
- }
-
- /*----------------------------清空GDRAM----------------------------*/
- void Clear_GDRAM(void)
- {
- unsigned char i,j,k;
- LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);
- k=0x80;
- for(i=0;i<32;i++)
- {
- LCD12864_Write(Write_Command,k++);
- LCD12864_Write(Write_Command,0x80);
- for(j=0;j<16;j++)
- {
- LCD12864_Write(Write_Data,0x00);
- }
- }
- k=0x80;
- for(i=0;i<32;i++)
- {
- LCD12864_Write(Write_Command,k++);
- LCD12864_Write(Write_Command,0x88);
- for(j=0;j<16;j++)
- {
- LCD12864_Write(Write_Data,0x00);
- }
- }
- LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);
- }
-
- /*----------------------------整页显示字符----------------------------*/
- void Display_Text(unsigned char code *addr)
- {
- unsigned char i;
- LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
- LCD12864_Write(Write_Command,0x80); //设置DDRAM地址
- Delay_10us();
- for(i=0;i<16;i++)
- {
- LCD12864_Write(Write_Data,*addr);
- addr++;
- }
- LCD12864_Write(Write_Command,0x90); //设置DDRAM地址
- Delay_10us();
- for(i=0;i<16;i++)
- {
- LCD12864_Write(Write_Data,*addr);
- addr++;
- }
- LCD12864_Write(Write_Command,0x88); //设置DDRAM地址
- Delay_10us();
- for(i=0;i<16;i++)
- {
- LCD12864_Write(Write_Data,*addr);
- addr++;
- }
- LCD12864_Write(Write_Command,0x98); //设置DDRAM地址
- Delay_10us();
- for(i=0;i<16;i++)
- {
- LCD12864_Write(Write_Data,*addr);
- addr++;
- }
- }
-
- /*----------------------------指定位置显示字符----------------------------*/
- void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
- {
- LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
- switch(y)
- {
- case 0:
- LCD12864_Write(Write_Command,0x80+x); //设置DDRAM地址
- Delay_10us();
- LCD12864_Write(Write_Data,Data1);
- LCD12864_Write(Write_Data,Data2);
- break;
- case 1:
- LCD12864_Write(Write_Command,0x90+x); //设置DDRAM地址
- Delay_10us();
- LCD12864_Write(Write_Data,Data1);
- LCD12864_Write(Write_Data,Data2);
- break;
- case 2:
- LCD12864_Write(Write_Command,0x88+x); //设置DDRAM地址
- Delay_10us();
- LCD12864_Write(Write_Data,Data1);
- LCD12864_Write(Write_Data,Data2);
- break;
- case 3:
- LCD12864_Write(Write_Command,0x98+x); //设置DDRAM地址
- Delay_10us();
- LCD12864_Write(Write_Data,Data1);
- LCD12864_Write(Write_Data,Data2);
- break;
- }
- }
-
- /*----------------------------初始化12864----------------------------*/
- void LCD12864_Init(void)
- {
- Delay_10ms(); //40mS延时
- Delay_10ms();
- Delay_10ms();
- Delay_10ms();
- LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
- Delay_x10us(10); //100uS延时
- LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
- Delay_x10us(4); //40uS延时
- LCD12864_Write(Write_Command,Clear_Display); //显示光标闪烁完全关闭
- Delay_x10us(10); //100uS延时
- LCD12864_Write(Write_Command,Clear_Display); //清除显示
- Delay_10ms(); //10mS延时
- LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right); //光标右移模式
- Delay_x10us(10); //100uS延时
- LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off); //开显示,无光标,光标不闪烁
- Delay_x10us(10); //100uS延时
- Clear_GDRAM(); //清空GDRAM
- Delay_x10us(10); //100uS延时
- }
-
- void Init(void)
- {
- P3M0=0x08;
- P3M1=0x00;
- IRIN=1;
- EA=1;
- EX0=1;
- IT0=1;
- Buzzer=0;
- LCD12864_Init();
- }
-
- /*----------------------------主函数----------------------------*/
- void main(void)
- {
- Init();
- Display_Text(Display_Data1);
- while(1)
- if(RXD==0)
- IAP_CONTR=0x60;
- }
-
- void IR_IN(void) interrupt 0
- {
- unsigned char j,k,n=0,q=0;
- EX0=0;
- Delay_x140us(15);
- if(IRIN==1)
- {
- EX0=1;
- return;
- }
- while(!IRIN)
- Delay_x140us(1);
- for(j=0;j<4;j++)
- {
- for(k=0;k<8;k++)
- {
- while(IRIN)
- Delay_x140us(1);
- while(!IRIN)
- Delay_x140us(1);
- while(IRIN)
- {
- Delay_x140us(1);
- n++;
- if(n>=30)
- {
- EX0=1;
- return;
- }
- }
- IRCOM[j]=IRCOM[j]>>1;
- if(n>=8)
- {
- IRCOM[j]=IRCOM[j]|0x80;
- }
- n=0;
- }
- }
- if(IRCOM[2]!=~IRCOM[3])
- {
- EX0=1;
- return;
- }
- else
- {
- Display_Data(1,2,Display_Hex[IRCOM[0]/16],Display_Hex[IRCOM[0]%16]);
- Display_Data(2,2,Display_Hex[IRCOM[1]/16],Display_Hex[IRCOM[1]%16]);
- Display_Data(3,2,Display_Hex[IRCOM[2]/16],Display_Hex[IRCOM[2]%16]);
- Display_Data(4,2,Display_Hex[IRCOM[3]/16],Display_Hex[IRCOM[3]%16]);
- Display_Data(6,2,Display_Hex[IRCOM[2]/16],Display_Hex[IRCOM[2]%16]);
- Buzzer=1;
- Delay_10ms();
- Buzzer=0;
- }
- EX0=1;
- }
复制代码
|