简易计算器,行扫描式,LCD显示(非完美版)。16按键
单片机计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- sbit Lcd_RS = P2^5;
- sbit Lcd_RW = P2^6;
- sbit Lcd_en = P2^7;
- uchar code table[] = "51201314";
- uchar code table1[] = "20140815";
- uchar code key16[]=
- {0xee,0xed,0xeb,0xe7,
- 0xde,0xdd,0xdb,0xd7,
- 0xbe,0xbd,0xbb,0xb7,
- 0x7e,0x7d,0x7b,0x77}
- uchar key_number;
- void delayMS(uint x)
- {
- uchar i;
- while(x--) for(i = 0; i < 120; i++);
-
- }
-
- bit Busy_Check()
- {
- bit state;
- Lcd_RS = 0;
- Lcd_RW = 1;
- Lcd_EN = 1;
- delayMS(1);
-
- state=(bit)(P0&0x80);
- Lcd_EN = 0;
- delayMS(1);
- return state;
- }
- void LCD_Wdata(uchar dat)
- {
- while(Busy_Check());
- Lcd_RS = 1;
- Lcd_RW = 0;
- Lcd_EN = 0;
- P0 = dat;
- Lcd_EN = 1;
- delayMS(1);
- Lcd_EN = 0;
- }
- void LCD_Wcmd(uchar cmd)
- {
- while(Busy_Check());
- Lcd_RS = 0;
- Lcd_RW = 0;
- P0 = cmd;
- delayMS(1);
- Lcd_EN = 0;
- Lcd_EN = 1;
- delayMS(1);
- Lcd_EN = 0;
- }
- void Init_Lcd()
- {
- LCD_Wcmd(0x38);
- delayMS(1);
- LCD_Wcmd(0x0f);
- delayMS(1);
-
- LCD_Wcmd(0x06);
- delayMS(1);
- LCD_Wcmd(0x01);
- delayMS(1);
- }
- bit pushkey()
- {
- P1=0xf0;
- if(P1!=0xf0)
- return (1);
- else
- return (0);
- }
- void key_scan()
- {
- uchar keycode,p;
- delayMS(15);
- if(P1!=0xf0)
- {P1?=?0xf7;
- while(1)
- {
- keycode = P1;
- if((keycode&0xf0)!=0xf0)?break;
- P1=_cror_(P1,1);
- }
- while((pushkey()));
- for (p?=?0 p<16?P++)
- if ( keycode== key16[p])
- key_number=p;
- }
- }
- void LCD_address(uchar hang,uchar lie )
- {
- if (hang%2==1) LCD_Wcmd(0x80+(lie%16)-1);
- else LCD_Wcmd(0x80+0x40+(lie%16)-1);
- }
- void LCD_display()
- { uchar j;
- LCD_address(1,1);
- while(table1[j]!='')
- {
- LCD_Wdata(table[j]);
- j++;
- }
-
- }
- void main()
- { uchar n=0;
- Init_Lcd();//初始化LCD
- LCD_display();
- while(1)
- {
- if(pushkey())//判断是否有键按下
- {
- key_scan();
- switch(key_number)
- {
- case 10: LCD_Wcmd(0x10);break;
- case 11: LCD_Wcmd(0x14);break;
- case 12: n++;
- if((n%2)==1)
- {
- LCD_Wcmd(0x80+0x40);break;
- }
- else LCD_Wcmd(0x80);break;
- ase 13: LCD_Wcmd(0x10);
- LCD_Wdata(0x00);LCD_Wcmd(0x10);break;
- case 15: LCD_Wcmd(0x01);break;
- default: LCD_Wdata(key_number+0x30);break;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
4乘4计算器LCD.rar
(49.01 KB, 下载次数: 26)
|