006: MSP430单片机矩阵键盘_LCD1602显示
1 #include<msp430F169.h> 2 //自定义数据结构,方便使用 3 #define uchar unsigned char 4 #define uint unsigned int 5 #define ulong unsigned long 6 /* 7 * 软件延时函数 8 */ 9 #define CPU_F ((double)8000000) //外部高频晶振8MHZ 10 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 11 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 12 //LCD1602液晶控制管脚配置 13 #define DataDIR P4DIR //数据口方向 14 #define DataPort P4OUT //P4口为数据口 15 16 #define RS_0 P5OUT &= ~BIT5 //RS置低 17 #define RS_1 P5OUT |= BIT5 //RS置高 18 19 #define RW_0 P5OUT &= ~BIT6 //RW置低 20 #define RW_1 P5OUT |= BIT6 //RW置高 21 22 #define EN_0 P5OUT &= ~BIT7 //E置低 23 #define EN_1 P5OUT |= BIT7 //E置高 24 /** 25 *显示屏命令写入函数 26 */ 27 void LCD_write_com(unsigned char com) 28 { 29 RS_0; 30 RW_0; 31 EN_1; 32 DataPort = com; //命令写入端口 33 delay_ms(5); 34 EN_0; 35 } 36 /** 37 * 显示屏数据写入函数 38 */ 39 void LCD_write_data(unsigned char data) 40 { 41 RS_1; 42 RW_0; 43 EN_1; 44 DataPort = data; //数据写入端口 45 delay_ms(5); 46 EN_0; 47 } 48 /** 49 * 显示屏字符串写入函数 50 */ 51 void LCD_write_str(unsigned char H,unsigned char L,unsigned char *s) 52 { 53 54 if (H == 0) 55 { 56 LCD_write_com(0x80 + L); //第一行显示 57 } 58 else 59 { 60 LCD_write_com(0xC0 + L); //第二行显示 61 } 62 63 while (*s) 64 { 65 LCD_write_data( *s); 66 s ++; 67 } 68 } 69 /** 70 * 显示屏单字符写入函数 71 */ 72 void LCD_write_char(unsigned char H,unsigned char L,unsigned char data) 73 { 74 75 if (H == 0) 76 { 77 LCD_write_com(0x80 + L); //第一行显示 78 } 79 else 80 { 81 LCD_write_com(0xC0 + L); //第二行显示 82 } 83 84 LCD_write_data(data); 85 } 86 /** 87 * 显示屏初始化函数 88 */ 89 void LCD_init(void) 90 { 91 EN_0; 92 LCD_write_com(0x38); //显示模式设置 93 delay_ms(5); 94 LCD_write_com(0x08); //显示关闭 95 delay_ms(5); 96 LCD_write_com(0x01); //显示清屏 97 delay_ms(5); 98 LCD_write_com(0x06); //显示光标移动设置 99 delay_ms(5); 100 LCD_write_com(0x0C); //显示开及光标设置 101 delay_ms(5); 102 } 103 /* 104 * 键盘扫描 105 */ 106 unsigned char key_scan(){ 107 uchar a=1,s,count=1; 108 uchar value=0; 109 for(a=1;a<0x10;a<<=1){ 110 P2DIR = 0xFF; 111 P2OUT = 0x00; 112 P2DIR=0x0f; 113 P2OUT=a; 114 if(P2IN!=a){ 115 if(0x10&P2IN) 116 s=0; 117 if(0x20&P2IN) 118 s=1; 119 if(0x40&P2IN) 120 s=2; 121 if(0x80&P2IN) 122 s=3; 123 value=s*4+count+'0'; 124 } 125 count++; 126 } 127 return value; 128 } 129 130 /** 131 * 主函数 132 */ 133 void main(void) 134 { 135 WDTCTL = WDTPW + WDTHOLD; //关看门狗 136 P4SEL = 0x00; 137 P4DIR = 0xFF; //数据口输出模式 138 P5SEL = 0x00; 139 P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式 140 LCD_init(); 141 uchar data; 142 while(1){ 143 LCD_write_str(0,0,"THE RESULT:"); 144 delay_ms(5); 145 if(key_scan()==0) 146 continue; 147 else 148 { 149 data = key_scan(); 150 delay_ms(10); 151 LCD_write_char(0,11,data); 152 delay_ms(5); 153 } 154 } 155 }
【人生没有白走的路,每一步都算数!】

浙公网安备 33010602011771号