📄 lcd.c
字号:
#define LCD_GLOBALS
#include "includes.h"
#define uchar unsigned char
#define uint unsigned int
typedef struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index[2]; // 汉字内码索引
char Msk[32]; // 点阵码数据
};
/* 以下几个程序是液晶状态字判断程序*/
//#pragma disable //关中断
uchar lcd_busy(void)
{
uchar dat;
// P7 = 0xff;
dat=lcd_control;
return(dat);
}
//#pragma disable
/*read-write instruct or data states*/
void lcd_st01(void)
{
while((lcd_busy()&3)!=3){;}
}
//#pragma disable
/*data auto-write state*/
void lcd_st3(void)
{
while ((lcd_busy()&8)!=8){;}
}
//#pragma disable
/*write lcd control instruct*/
void lcd_ctrl(uchar dat)
{
lcd_st01();
lcd_control=dat;
}
//#pragma disable
/*write lcd data */
void lcd_write(uchar dat)
{
lcd_st01();
lcd_data=dat;
}
//#pragma disable
/*auto write*/
void lcd_autowrite(uchar dat)
{
lcd_st3();
lcd_data=dat;
}
/* 液晶初始化程序 */
//#pragma disable
/*lcd initial*/
void lcd_initial()
{
/*text start address */
lcd_write(0x00);lcd_write(0x10);lcd_ctrl(0x40);//1000H
/*set text zone width */
lcd_write(0x10);lcd_write(0x00);lcd_ctrl(0x41);//0000H
/*graph start address */
lcd_write(0x00);lcd_write(0x00);lcd_ctrl(0x42);//
/*set graph zone width*/
lcd_write(0x10);lcd_write(0x00);lcd_ctrl(0x43);
/*cgrom 00h~7fh,cgram 80h~ffh ,logical or */
lcd_ctrl(0x80);
/*open text,graph and close cursor */
lcd_ctrl(0x9c);
/*cursor shape :8*8 */
lcd_ctrl(0xa0);
/*cursor position*/
lcd_write(0x0f);lcd_write(0x09);lcd_ctrl(0x21);
}
/* 清空T6963控制器内存,共8K*/
void lcd_clear_ram()
{
uint i;
lcd_write(0x00);lcd_write(0x00);lcd_ctrl(0x24);
lcd_ctrl(0xb0);
for(i=0;i<8192;i++)
{
lcd_autowrite(0x00);
}
lcd_ctrl(0xb2);
}
void lcd_clear(uchar x,uchar y,uchar m ,uchar n ){ //任意长度的清屏函数
//x,y分别是128,64内对应的地址
//m,n分别是所要清的内容的长和宽
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
showdot0(x+j,y-i);
}
}
/* 以下是图形显示子程序 */
/*set graph x and y */
/* 0------------->x */
/* | */
/* | */
/* | */
/*\|/ */
/* y */
/* 如果是采用清华蓬远T240128图形点阵液晶 */
/* 下面这个函数lcd_set_graph()中第二条语句*/
/* y应该乘以30(240/30)其他型号依此类推*/
void lcd_set_graph(uint x,uint y) //将图形在屏幕上的图形地址转化为内存里的地址
{
uint xy;
xy=y*16+x;lcd_write(xy&0xff);
xy=xy/256;//must use 256,not 0xff
lcd_write(xy);lcd_ctrl(0x24);
}
/* display 8 dots*/
void lcd_disp8(uchar dat) //在一个地址__8位里打点,dat是几就打对应位子的点
{ lcd_write(dat);
lcd_ctrl(0xc0);
}
void showdot(unsigned int x,unsigned int y){ //在任意位置显示一个点
lcd_set_graph(x/8,63-y);
lcd_ctrl(7-x%8+0xf8);
}
void showdot0(unsigned int x,unsigned int y){ //在任意一个点处显示一点空白
lcd_set_graph(x/8,63-y);
lcd_ctrl(7-x%8+0xf0);
}
/* 显示16x8图形点阵的子程序*/
/* 字符库为asc[]*/
void lcd_disp1608(uint x,uint y,uchar n) //在某一位置处显示显示一个字符 n表该字符在数组中的序号
{ //显示字符,上下间间隔1,左右间间隔1
uchar i; uint j;
for(i=0;i<16;i++)
{
lcd_set_graph(x,y+i);
j=n*16+i;
lcd_disp8(asc8[j]);
}
}
/**************************************************************************/
/* 显示8*8的ASC字母 */
/**************************************************************************/
void lcd_disp88( uchar x, uchar y, char* s, uchar xor )//横向,纵向按字节
{
uchar name, i; //要想能滑动显示最好用些种方法显示字符或字符串
uint start;
while ( *s )
{
name = * s;
start = ( name - 32 )* 8;
for ( i = 0; i < 8; i++ )
{
lcd_set_graph( x, y + i );
if ( xor == 0 )
{
lcd_disp8( nAsciiDot[start + i] );
}
if ( xor == 1 )
{
lcd_disp8( 255-nAsciiDot[start + i] );
}
}
s += 1;
x += 1;
if ( x >= 16 )
{ x=0;
y += 8;
}
}
}
/* 显示16x16图形点阵的子程序*/
/* 字符库为hzk02[]*/
void lcd_disp1616(uint x,uint y,uchar n) //在某一位置处显示显示一个16*16汉字 n表该字符在数组中的序号
{ //显示汉字 上下行间间隔16,左右间间隔2
uchar i; uint j;
for(i=0;i<16;i++)
{
lcd_set_graph(x,y+i);
j=n*32+i*2;
lcd_disp8(hzk02[j]);
lcd_disp8(hzk02[j+1]);
}
}
void lcd_disp3232(uint x,uint y,uchar n) //左右间间隔32/8=4,上下间间隔32.
{
uchar i;uint j;
for(i=0;i<32;i++)
{
lcd_set_graph(x,y+i);
j=n*128+i*4;
lcd_disp8(hzk03[j]);
lcd_disp8(hzk03[j+1]);
lcd_disp8(hzk03[j+2]);
lcd_disp8(hzk03[j+3]);
}
}
/* 显示16x24图形点阵的子程序*/
/* 字符库为hzk00[]*/
/*void lcd_disp1624(uint x,uint y,uchar n)
{
uchar i; uint j;
for(i=0;i<24;i++)
{
lcd_set_graph(x,y+i);
j=n*48+i*2;
lcd_disp8(hzk00[j]);
lcd_disp8(hzk00[j+1]);
}
}*/
/* 显示16x24图形点阵的子程序*/
/*display 24x24 dots */
/* 字符库为hzk01[]*/
/*void lcd_disp2424(uint x,uint y,uchar n) //左右间间隔24/8=3,上下间间隔24.
{
uchar i;uint j;
for(i=0;i<24;i++)
{
lcd_set_graph(x,y+i);
j=n*72+i*3;
lcd_disp8(hzk01[j]);
lcd_disp8(hzk01[j+1]);
lcd_disp8(hzk01[j+2]);
}
}*/
/////////////////////////////////////////
/* 以下几个函数为文本特征下*/
/*set graph x and y */
/* 0------------->x */
/* | */
/* | */
/* | */
/*\|/ */
/* y */
/* 如果是采用清华蓬远T240128图形点阵液晶 */
/* 下面这个函数lcd_set_graph()中第二条语句*/
/* y应该乘以30(240/30)其他型号依此类推*/
/*set text x and y*/
void lcd_set_text(uint x,uint y) //将文本地址转化为内存里的地址
{
uint xy;
xy=y*16+x+16*256;lcd_write(xy&0xff);
xy=xy/256;lcd_write(xy);lcd_ctrl(0x24);
}
//x为行字节数,y为列字节数
void lcd_disp_text(uchar x,uchar y,uchar ccode) //在某一指定位置显示一个字符,ccode是该字符在ROM表中的位置
{ //故要显示字母或数字时 ccode=字母或数字+0X10;
lcd_set_text(x,y);
lcd_write(ccode);lcd_ctrl(0xc4);
}
void lcd_disp_char(uchar x,uchar y,uchar ccode){ //在某一指定位置显示一个字符 ccode 是该字符的ASC码值
lcd_set_text(x,y);
lcd_write(ccode-0x20);lcd_ctrl(0xc0);
}
void lcd_disp_string(uchar x,uchar y,uchar ccode[],uchar length){//在某一指定位置显示一个字符串 ccode是;
uchar i; //用双引号引起的字符串
for(i=0;i<length;i++){
lcd_disp_char(x+i,y,ccode[i]);
}
}
/* first write a text letter on graph zone,then write char-attribe
/* on graph zone.NOTE: address must be the same. */
/*void lcd_text_attr(uchar x,uchar y,uchar cattr)
{
lcd_set_graph(x,y);
lcd_write(cattr);lcd_ctrl(0xc0);//char-attr write on graph zone accordingly.
}*/
/* 建立自定义字库1,字符库为hzk1[]*/
/*void lcd_set_cgram1(void)
{
uint i;
lcd_write(0x03);//1800-1fffh
lcd_write(0x00);lcd_ctrl(0x22);
lcd_write(0x00);lcd_write(0x1c);
lcd_ctrl(0x24);lcd_ctrl(0xb0);
for(i=0;i<0x400;i++)//1k
{
lcd_autowrite(hzk1[i]);
}
lcd_ctrl(0xb2);
}
/* 建立自定义字库2,字符库为hzk2[]*/
/*void lcd_set_cgram2(void)
{
uint i;
lcd_write(0x03);//1800-1fffh
lcd_write(0x00);lcd_ctrl(0x22);
lcd_write(0x00);lcd_write(0x18);
lcd_ctrl(0x24);lcd_ctrl(0xb0);
for(i=0;i<0x800;i++)//2k
{
lcd_autowrite(hzk2[i]);
}
lcd_ctrl(0xb2);
}
/* 建立自定义字库3,字符库为hzk3[]*/
/*void lcd_set_cgram3(void)
{
uint i;
lcd_write(0x03);//1800-1fffh
lcd_write(0x00);lcd_ctrl(0x22);
lcd_write(0x00);lcd_write(0x1c);
lcd_ctrl(0x24);lcd_ctrl(0xb0);
for(i=0;i<0x400;i++)//1k
{
lcd_autowrite(hzk3[i]);
}
lcd_ctrl(0xb2);
}
/* 显示一个汉字,16x16*/
/* x为行字节数,y为列字节数*/
/*void lcd_disp_hz(uchar x,uchar y,uchar ccode)
{
lcd_set_text(x,y);
lcd_write(ccode); lcd_ctrl(0xc4);// left-up
lcd_set_text(x,y+1); lcd_write(ccode+1);
lcd_ctrl(0xc4);//left-down
lcd_set_text(x+1,y);lcd_write(ccode+2);
lcd_ctrl(0xc4);//right-up
lcd_set_text(x+1,y+1);lcd_write(ccode+3);
lcd_ctrl(0xc4);//rignt-dowm
}
/*设置汉字属性*/
/* x为行字节数,y为列字节数*/
/*void lcd_hz_attr(uchar x,uchar y,uchar cattr)
{
lcd_text_attr(x,y,cattr);
lcd_text_attr(x+1,y,cattr);
lcd_text_attr(x,y+1,cattr);
lcd_text_attr(x+1,y+1,cattr);
}*/
void Delay(uchar x){
for(;x>0;x--){
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -