t6963c的c51程序
/***********************************/
/* lcm(rt-240128ta)显示程序 */
/* lcm 控制芯片 t6963c 带32kram */
/* mcu 型号: stc 89c52rd2 */
/* 时钟频率: 11.0592 mhz */
/* 接口方式: 直接接口(总线方式) */
/* 开发环境: keil c51 v7.03 */
/* 开发日期: 2006.07.01 */
/* 程序编写: liu1234 */
/***********************************/
#define t6963c_c 1
#i nclude t6963c3.h
uint txthome,grhome;
/**********************************
//= 函数原型: uchar check_cmd_st()
//= 功 能: 查询是否可读写命令和数据的状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_cmd_st(void) // 状态位sta1,sta0 判断(读写指令和读写数据)
{
uchar i;
for(i=100;i>0;i--)
{
if((lcmcp & 0x03) == 0x03)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_ar_st
//= 功 能: 查询是否可数据自动读状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_ar_st(void) // 状态位st2 判断(数据自动读状态)
{
uchar i;
for(i=100;i>0;i--)
{
if((lcmcp & 0x04) == 0x04)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_aw_st
//= 功 能: 查询是否可数据自动写状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_aw_st(void) // 状态位st3 判断(数据自动写状态)
{
uchar i;
for(i=100;i>0;i--)
{
if((lcmcp & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_scrpeek_st()
//= 功 能: 查询是否可屏读/屏拷贝状态状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_scrpeek_st(void) // 状态位st6 判断(屏读/屏拷贝状态)
{
uchar i;
for(i=100;i>0;i--)
{
if((lcmcp & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar wr_cmd_2(uchar ucmd,uint upar)
//= 功 能: 给t6963c写带双参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_2(uchar ucmd,uint upar) // 写双参数的指令
{
if(check_cmd_st() == 0) return 1;
lcmdp = (uchar)(upar& 0xff);//先写低字节,再写高字节
if(check_cmd_st() == 0) return 2;
lcmdp = (uchar)(upar>>8);
if(check_cmd_st() == 0) return 3;
lcmcp = ucmd;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_1(uchar ucmd,uchar upar1)
//= 功 能: 给t6963c写带单参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_1(uchar ucmd,uchar upar) // 写单参数的指令
{
if(check_cmd_st() == 0) return 1;
lcmdp = upar;
if(check_cmd_st() == 0) return 2;
lcmcp = ucmd;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_0(uchar ucmd)
//= 功 能: 给t6963c写无参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_0(uchar ucmd) // 写无参数的指令
{
if(check_cmd_st() == 0) return 1;
lcmcp = ucmd;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_data(uchar udata)
//= 功 能: 给t6963c写一次数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_data(uchar udata) // 写一次数据
{
if(check_cmd_st() == 0) return 1;
lcmdp = udata;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar awr_data(uchar udata)
//= 功 能: 给t6963c写一个地址增加自动连续数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar awr_data(uchar udata) // 自动写数据
{
if(check_aw_st() == 0) return 1;
lcmdp = udata;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar ard_data(uchar udata)
//= 功 能: 从t6963c读一个地址增加自动连续数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar ard_data(void) // 自动读数据
{
if(check_ar_st() == 0) return 1;
return lcmdp;
}
/**********************************
//= 函数原型: void char_addr_pointer_set(uchar urow, uchar ucol)
//= 功 能: 根据字符的行列设置vram地址
//= 参 数:
//= 返 回 值:
//= 函数性质:私有函数
**********************************/
void char_addr_pointer_set(uchar urow, uchar ucol)
{
uint ipos;
ipos = urow * 30 + ucol + txthome;
wr_cmd_2(lc_add_pos,ipos);
}
/**********************************
//= 函数原型: clr_char_scr(void)
//= 功 能: 清除当前文本屏幕
//= 参 数:
//= 返 回 值:
//= 函数性质:公有函数
**********************************/
void clr_char_scr(void)//文本屏可以在内存中保持很多屏
{
uint i;
// char_addr_pointer_set(0,0);//从0行0列开始
char_addr_pointer_set(2,0);//从0行0列开始
wr_cmd_0(lc_aut_wr); // 自动写
// for(i=0;i<16*30;i++) //16行30列字符
for(i=0;i<14*30;i++) //16行30列字符
{
awr_data(0x00); // 写数据空白
}
wr_cmd_0(lc_aut_ovr); // 自动写结束
char_addr_pointer_set(0,0); // 重置地址指针
}
/**********************************
//= 函数原型: clr_lcdram(void)
//= 功 能: 清除所有的显示内存
//= 参 数:
//= 返 回 值:
//= 函数性质:私有函数
**********************************/
void clr_lcdram(void)
{
uint i;
wr_cmd_2(lc_add_pos,0x0000); // 设置地址指针0
wr_cmd_0(lc_aut_wr); // 自动写
for(i=0;i> 11);//cgram 偏移地址设置
wr_cmd_0(lc_mod_xor|0x08); // 显示方式设置,异或,字符全部用ram区域生成
wr_cmd_0(lc_dis_sw |0x0c); // 显示开关设置,图文混和模式
clr_lcdram();//清除内存
}
/**********************************
//= 函数原型: pixel(unsigned char pointx,unsigned char pointy, bit mode)
//= 功 能: 在指定坐标位置显示一个点
//= 参 数: 坐标,显示点或清除点
//= 返 回 值:
//= 函数性质:私有函数
//= 如果显示屏超过了256*256,请修改这个函数 pointx,pointy的类型
//= mode 1:显示 0:清除该点
**********************************/
pixel(unsigned char pointx,unsigned char pointy, bit mode)
{
unsigned int startaddr;
unsigned char dat;
startaddr=(uint)pointx*30 + pointy/8 + grhome;
dat=lc_bit_op+7-pointy%8; //生产位操作命令画点的数据
if(mode) dat=dat|0x08;
wr_cmd_2(lc_add_pos,startaddr);//设置该点所在单元地址
wr_cmd_0(dat); // 利用位操作命令画点
}
/**********************************
//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit mode)
//= 功 能: 划线函数
//= 参 数: 坐标1,坐标2,显示点或清除点
//= 返 回 值:
//= 函数性质:私有函数
//= 其它:显示点阵不超过255*255
/**********************************/
void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2, bit mode)
{
unsigned char x,y;
float k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=((float)y2-y1) / ((float)x2-x1) ;
b=y1-k*x1;
if( x1 <= x2 )
{
for(x=x1;x1
{
k=((float)x2-x1) / ((float)y2-y1) ;
b=x1-k*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=(uchar)(k*y+b);
pixel( x , y,mode );
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(uchar)(k*y+b);
pixel( x , y,mode );
}
}
}
}
/**********************************
//= 函数原型: void showchar(uchar row,uchar col,uchar ch)
//= 功 能: 在指定行列显示8*16字符
//= 参 数: 坐标行,坐标列,字符串指针
//= 返 回 值:
//= 函数性质:公有函数
//=其它:所有可显示字符不超过128个,否则本函数有溢出的可能
**********************************/
void showchar(uchar col,uchar row,uchar *chp)
{
#define hzp chp
uchar char_sequence_number;
uchar ascii_num;
row/=8;col/=8;
while (*chp != '\0')
{
if (*chp>=1;//一个汉字两个字符位
for (ascii_num=0;ascii_sub_index[ascii_num]!='\0';ascii_num++);//计算ascii字符个数
char_sequence_number=ascii_num*2+char_sequence_number*4;//一个汉字字符占四个8*8字符
//写汉字左上角
char_addr_pointer_set(row,col);//设置vram地址
wr_data(char_sequence_number); //写数据
wr_cmd_0(lc_unchanged_wr); //写命令
//写汉字左下角
row+=1;//左下角下一行
char_addr_pointer_set(row,col);//设置vram地址
wr_data(char_sequence_number+1); //写数据
wr_cmd_0(lc_unchanged_wr); //写命令
//写汉字右上角
row-=1;col+=1;//右上角上一行,下一列
char_addr_pointer_set(row,col);//设置vram地址
wr_data(char_sequence_number+2); //写数据
wr_cmd_0(lc_unchanged_wr); //写命令
//写汉字右下角
row+=1;//右下角下一行
char_addr_pointer_set(row,col);//设置vram地址
wr_data(char_sequence_number+3); //写数据
wr_cmd_0(lc_unchanged_wr); //写命令
row-=1; col+=1; //指向下一汉字位置
if(col==30){row+=2;col=0;}
}
}
}
/**********************************
//= 函数原型: void showchar(uchar row,uchar col)
//= 功 能: 在指定行列反显一个字符8*16
//= 参 数: 行,列
//= 返 回 值:
//= 函数性质:公有函数
**********************************/
void negative_showchar(uchar col,uchar row,uchar n,bit attribute)
{
uint addr;
uchar line,dat,i;
row/=8;col/=8;
dat=0;//不反显数据
if (attribute)dat=0xff;//反显数据
for(i=0;i
{
// for(line=0;line<16;line++)
for(line=1;line<15;line++)
{
addr=(uint)(row*8+line)*30 + col+i+grhome;//一row占8line,一line30个字节.一列1字节图
wr_cmd_2(lc_add_pos,addr);//设置白线开始地址
wr_data(dat);//画一条白线
wr_cmd_0(lc_unchanged_wr);
}
}
}
/**********************************
//= 函数原型: void fill_cgram(void)
//= 功 能: 填充cgram数据
//= 参 数:
//= 返 回 值:
//= 函数性质:私有函数
**********************************/
void fill_cgram(void)
{
uint i,char_sequence_number;
uint hz_adder;
uchar code *p;
//处理ascii点阵
for (char_sequence_number=0;ascii_sub_index[char_sequence_number]!='\0';char_sequence_number++)
{
for(i=0;ascii_lib_index[i]!='\0';i++)//从总表中定位要显示字符的位置
{
if (ascii_sub_index[char_sequence_number]==ascii_lib_index[i])
{
break;
}
}
if(ascii_lib_index[i]=='\0'){i=1;}//字符不存在,则装载第一字符,非0个
i=i*16;//每个ascii字符16个字节
p = &ascii_dot_lib[i];
wr_cmd_2(lc_add_pos,cgramstart+char_sequence_number*16);//设置cgram开始地址
wr_cmd_0(lc_aut_wr);
for(i=0;i<16;i++)
{
awr_data(*p++); // 写数据
}
wr_cmd_0(lc_aut_ovr); // 自动写结束
}
hz_adder = cgramstart+char_sequence_number*16;
//处理汉字点阵
for (char_sequence_number=0;hz_sub_index[char_sequence_number]!='\0';char_sequence_number+=2)
{
for(i=0;hz_lib_index[i]!='\0';i+=2)//从总表中定位要显示字符的位置
{
if ((hz_sub_index[char_sequence_number]==hz_lib_index[i])&&(hz_sub_index[char_sequence_number+1]==hz_lib_index[i+1]))
{
break;
}
}
if(hz_lib_index[i]=='\0'){i=0;}
i=i*16;//每个hz占32个字节
p = &hz_dot_lib[i];
wr_cmd_2(lc_add_pos,hz_adder+char_sequence_number*16);//设置cgram开始地址
wr_cmd_0(lc_aut_wr);
for(i=0;i<32;i++)
{
awr_data(*p++); // 写数据
}
wr_cmd_0(lc_aut_ovr); // 自动写结束
}
}
5G和AI技术的持续进步,中国智能硬件的产业潜力将进一步释放
柔性电子常用材料及用途
通电延时和断电延时电路接线图
当触控走进电脑完全不同的体验
对神经网络进行物理教学,可助人工智能消除混沌盲目性
t6963c的c51程序
点胶机三大组成部分
SMCJ9.0E3/TR13 整卷3000个 STOCK
更智能的汽车可减少碰撞发生
基于以太网的汽车网络架构解决方法
码垛机器人由哪些机构组成
怎样将旧硬盘改装成时钟
蓝牙耳机如何选择,时尚又实用的降噪蓝牙耳机推荐
在特定于应用的自动化测试设备系统中设计设备电源IC
5G网络能有多快 将提高到1Gbps相当于“千兆局域网”
威马汽车携手美团打车 探索出行跨界新模式
利尔达获评“2022年度中国物联网企业100强”!
稳压二极管正负极_稳压二极管正负极判断_稳压二极管正负极接法
5G助推形成万亿级数字化平台
苹果将于6月举行发布会:iPhone8三大新功能期待吗