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 }

 

 

【人生没有白走的路,每一步都算数!】

posted @ 2018-10-09 19:27  xiaobingzzh  阅读(357)  评论(0)    收藏  举报