电子信息工程技术专业《外围电路模块设计》 显示与按键
六、程序编程
1、1602LCD程序编写:
/******************************************************************** * 文件名 : 液晶1602显示.c
* 描述 : 该程序实现了对液晶1602的控制
***********************************************************************/ #include
#define uchar unsigned char #define uint unsigned int
//这三个引脚参考资料 sbit E =P2^2; //1602使能引脚 sbit RW=P2^1; //1602读写引脚 sbit RS=P2^0; //1602数据/命令选择引脚
/******************************************************************** * 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
***********************************************************************/ void delay() { int i,j; for(i=0; i<=100; i++); for(j=0; j<=20; j++); }
/******************************************************************** * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值
***********************************************************************/ void enable(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); }
/******************************************************************** * 名称 : write(uchar del)
11
电子信息工程技术专业《外围电路模块设计》 显示与按键
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据 * 输出 : 无
***********************************************************************/ void write(uchar del) { P0 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); }
/******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,
***********************************************************************/ void L1602_init(void) { enable(0x01); enable(0x38); //设置16*2显示,5*7点阵,8位数据接口 enable(0x0c); //设置开关显示,不显示光标 enable(0x06); //写一个字符后地址指针自动加1 enable(0xd0); //显示清0,数据指针清0 }
/******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示\,调用该函数如下 L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据 * 输出 : 无
***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); //写符号 }
/******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
12
电子信息工程技术专业《外围电路模块设计》 显示与按键
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示\,调用该函数如下 L1602_string(1,5,\* 输入 : 行,列,需要输入1602的数据 * 输出 : 无
***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\\0') break; write(*p); p++; } }
/******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无
* 输出 : 显示第一行“2”,第二行“b”
***********************************************************************/ void Main() { uchar i = 48; L1602_init(); L1602_char(1,5,'b'); L1602_string(1,1,\ L1602_string(2,1,\ while(1); }
最后的显示结果图如下:
13
电子信息工程技术专业《外围电路模块设计》 显示与按键
图8 1602LCD显示结果
2、12864与按键程序编写:
#include
sbit lcd_sclk=P3^2; /*接口定义:lcd_sclk 就是 LCD 的 sclk*/ sbit lcd_sid=P3^1; /*接口定义:lcd_sid 就是 LCD 的 sid*/ sbit lcd_rs=P3^0; /*接口定义:lcd_rs 就是 LCD 的 rs*/ sbit lcd_reset=P1^0; /*接口定义:lcd_reset 就是 LCD 的 reset*/ sbit lcd_cs1=P1^1; /*接口定义:lcd_cs1 就是 LCD 的 cs1*/
sbit Rom_IN=P1^2; /*字库 IC 接口定义:Rom_IN 就是字库 IC 的 SI*/ sbit Rom_OUT=P1^3; /*字库 IC 接口定义:Rom_OUT 就是字库 IC 的 SO*/ sbit Rom_SCK=P1^4; /*字库 IC 接口定义:Rom_SCK 就是字库 IC 的 SCK*/ sbit Rom_CS=P1^5; /*字库 IC 接口定义 Rom_CS 就是字库 IC 的 CS#*/ #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code bmp1[]; uchar code bmp2[];
void transfer_command_lcd(int data1) {
char i; lcd_rs=0;
for(i=0;i<8;i++) {
lcd_sclk=0;
if(data1&0x80) lcd_sid=1; else lcd_sid=0;
14
电子信息工程技术专业《外围电路模块设计》 显示与按键
lcd_sclk=1;
data1=data1<<=1; } }
/*写数据到LCD 模块*/
void transfer_data_lcd(int data1) {
char i; lcd_rs=1;
for(i=0;i<8;i++) {
lcd_sclk=0;
if(data1&0x80) lcd_sid=1; else lcd_sid=0; lcd_sclk=1;
data1=data1<<=1; } }
/*延时*/
void delay(int n_ms) {
int j,k;
for(j=0;j unsigned char Key_Scan(void)//键盘扫描函数如果有键按下返回键ASC 值若无返回 0 { P2=0XF0; if(P2!=0XF0)//先确定是否有键按下 { //--------------1------------------------------------ P2=0XFE; switch (P2)//测P1^0~~~P1^3 有没有低的 { case 0xee: return '0';//P1^3 低返回'0' case 0xde: return '1';//P1^2 低返回'1' case 0xbe: return '2';//P1^1 低返回'2' case 0x7e: return '3';//P1^0 低返回'3' default: break;//没有本行的键按下继续下面扫描 } //---------------------------------------------------- //-------------2-------------------------------------- P2=0XFD; switch (P2)//测P1^0~~~P1^3 有没有低的 15