📄 +_-
字号:
//#include <iom16v.h>
//#include <macros.h>
//#pragma interrupt_handler miao9:9
//#pragma interrupt_handler miao2:2
//液晶命名
//#define uchar unsigned char
//#define uint unsigned int
//#define SET_PSB PORTA|=BIT(3)
//#define CLR_PSB PORTA&=~BIT(3)
#define SET_CS PORTA|=BIT(4)
#define CLR_CS PORTA&=~BIT(4)
#define SET_SID PORTA|=BIT(5)
#define CLR_SID PORTA&=~BIT(5)
#define SET_SCLK PORTA|=BIT(6)
#define CLR_SCLK PORTA&=~BIT(6)
/****************************************************************
微秒延时
*****************************************************************/
void delay(uint US)
{
uint i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
/****************************************************************
毫秒延时
*****************************************************************/
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
/****************************************************************
端口初始化
*****************************************************************/
void port_init12864()
{
DDRA|=BIT(4)|BIT(5)|BIT(6); //设定a口输出
PORTA&=0X8F; //a口输出低
//DDRB=0XFF; //设定b口输出
//PORTB=0X00; //输出低
SET_CS; //片选
//SET_SCLK;
}
/****************************************************************
液晶屏初始化
*****************************************************************/
void lcd_init12864()
{
//CLR_PSB; //当PSB为低时 液晶处于串行数据模式
write_com12864(0x30); //功能设定:8位接口控制位,基本指令集
delay(5);
write_com12864(0x0C); //显示开关设置:整体显示开,游标显示关,正常显示
delay(5);
write_com12864(0x01); //清除显示
delay(5);
}
/*****************************************************************
字节传送,一个字节一个传
******************************************************************/
void sendbyte12864(uchar byte)
{
uint t;
for(t=8;t>0;t--)
{
CLR_SCLK;
if(byte & BIT(t-1)) SET_SID;
else CLR_SID;
delay(2);
SET_SCLK;
}
}
/****************************************************************
写指令函数
*****************************************************************/
void write_com12864(uchar com)
{
//SET_CS;
sendbyte12864(0xf8); //定义写指令写命令
delay(2);
sendbyte12864(com&0xf0);//先写高四位
delay(2);
sendbyte12864(com<<4); //接写低四位
delay(2);
//CLR_CS;
}
/****************************************************************
写字数据指令
*****************************************************************/
void write_dat12864(uchar dat)
{
//SET_CS;
sendbyte12864(0xfa);
delay(2);
sendbyte12864(dat&0xf0);
delay(2);
sendbyte12864(dat<<4);
delay(2);
//CLR_CS;
}
/****************************************************************
液晶定位函数
*****************************************************************/
void lcd_pos12864(uchar y,uchar x)
{
switch(y)
{
case 0: write_com12864(0x80+x);break;
case 1: write_com12864(0x90+x);break;
case 2: write_com12864(0x88+x);break;
case 3: write_com12864(0x98+x);break;
default:break;
}
}
/****************************************************************
12864的写字符串函数
*****************************************************************/
void writeString12864(uchar * str)
{
uchar i = 0;
while(str[i] != '\0')//判断是否是字符串结束符
{
write_dat12864(str[i++]);
}
}
/****************************************************************
画图函数 逐行,顺向,8*16
****************************************************************/
void drawpic12864(const uchar *p)
{
uchar i, j, k ;
write_com12864(0x36); //扩充指令集动作
delay(2);
write_com12864(0x36);
delay(2);
write_com12864(0x3e); //找开绘图显示功能
delay(2);
write_com12864(0x01); //清屏
for(i=0;i<32;i++) //画上半屏 32行点阵
{
write_com12864(0x80+i); //设定 DDRAM 位址到位址计数器(AC) 写每行点阵都要先写这个指令
write_com12864(0x80);
for(j=0;j<16;j++) //每个字节8个点 16*8=128个点 所以上面画了128*32个点
{
write_dat12864(*p++);
}
}
for(i=0;i<32;i++) //画下半屏
{
write_com12864(0x80+i);
write_com12864(0x88);
for(j=0;j<16;j++)
{
write_dat12864(*p++);
}
}
}
//port_init();
//lcd_init();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -