导航:首页 > 操作系统 > 单片机汉字程序

单片机汉字程序

发布时间:2023-03-21 00:53:59

⑴ 给个单片机液晶1602显示汉字的程序,谢谢

51单片机对lcd1602一些基础程序

#include <intrins.h>
#define dataport P1
sbit RS=P2^ 6;
sbit RW=P2^5;
sbit EN=P2^4;
//========================

//=========================
void waitfor() //检测忙信号函数
{
dataport=0xff;
RS=0;RW=1;_nop_(); //选择指令寄存器 读操作
EN=1;_nop_(); //使能操作
while(dataport&0x80); //如果最高位是1 表示1602正忙 原地踏步 忙完后芯片会将高位拉低
EN=0;
}
//======================
void writedata(unsigned char dataw) //写数据到lcm
{
waitfor(); //测忙
RS=1;RW=0;_nop_(); //选择数据寄存器 写操作
dataport=dataw;_nop_(); //将数据送到数据口
EN=1;_nop_();_nop_();EN=0; //使能
}
//==========================
void writecmd(unsigned char cmd) //写命令到lcm
{
waitfor();
RS=0;RW=0;_nop_();
dataport=cmd;_nop_();
EN=1;_nop_();_nop_();EN=0;
}
//===========================
void init(void) // 初始化函数
{
writecmd(0x38); //功能设定 8位数据传输 双行显示
writecmd(0x0c);//显示器开关
writecmd(0x01);//清屏
writecmd(0x06);//字符进入模式 每进入一个字符光标向右移动一格 原有字符不动
//我在刚开始学的时候不知道下一个字符显示在哪 是和AC值有关还是和光标位置有关?
//最后摸索出来是只和光标定位有关 现在还是不知道Ac值有什么用

}
//=========================
void location(unsigned char x,unsigned char y) //确实坐标函数
{
unsigned char temp;
temp=x&0x0f; //只要x数据的后四位
if(y){temp=temp|0x40;} //第一行为0 第二行为1 如果y=1则地址加0x40
temp|=0x80; //DDRAM地址的命令DB7为一
writecmd(temp);

}
//==============================
void displyonechar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数
{
location(x,y);
writedata(dataw);
}
//=======================================
void displylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串
{
while(*p) //当一个字符型数组读完时*P指的为零
{
displyonechar(x,y,*(p++));
x++;
}
}
//=====================================================
void writecgram(unsigned char address,unsigned char *p) //写CGRAM的数据
{
unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x80
while(i--)
{
writedata(*p);
p++;
}
}
//=====================================================
void displyonecharacter(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) //显示一个自定义字符
{

unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x08
while(i--)
{
writedata(*p);
p++;
}
//============================================================
location(x,y); //设定要显示的位置
writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示 搞了半天发现CGRAM里的地址
} //和DDRAM里的地址有上面的转换关系
//========================================================
void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数
{
unsigned int number[8];
int k,gh;
for(k=0;;k++)
{
*(number+k)=(unsigned int)(num%10);//强制类型转换
num=num/10;
if(num==0)break;
}
for(gh=k;gh>=0;gh--)
{
displyonechar(x,y,(*(number+gh)+48));
x++;
}
}

//字型码
uchar code nin[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};// "年"
uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"
uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"

显示汉字

displyonecharacter(0,0,0x40,nin);
displyonecharacter(1,0,0x80,yue);
displyonecharacter(1,0,0xc0,ri);

⑵ 51单片机点阵显示一个汉字

8x8的点阵太小,很难正常显示一个汉字,通常,会使用4个8x8的点阵即16x16的点阵来显示一个汉字。

单片机在通过点阵显示汉字的时候,需要用到如下技术手段:

1、汉字取模

汉字取模,即把汉字对应16x16点阵的图形用16进制数来描述,形成可以用于驱动显示的数据。

例如下图,的汉字“中”

该字的16x16点阵图形中,每行有16个像素,可以编码为2个字节,每8个像素,对应一个字节的高低位,则该字编码的前2个字节为0x01,0x80……,如此,可用32个字节描述汉字的点阵图形。

关于汉字取模有很多开源的软件,你可以搜索下载并使用,将你的程序中所需要使用的汉字,全部处理成字模,再定义到程序中即可。(也可以使用汉字字库芯片,这里就不讨论了)

2、扫描显示

通常,驱动点阵设备时,为了节约单片机的管脚资源,会使用锁存器一类的期间,即锁存器输出端与点阵连接,而输入段由单片机控制,采用行、场扫描或分块行、场扫描的方式驱动,具体你可以搜寻相关资料。

⑶ 51单片机LCD1602汉字

LCD1602只允许显示ASCII字符,汉子不在其中,不能显示。汉子可以使用点阵型的LCD显示,如LCD12864。

⑷ 怎么编写单片机——TFT彩屏汉字程序

你现在看到的这两个函数LCD_ShowString()ChineseChar()是你在上层调用的,具体的函数定义你要去看底层是怎么实现的。我先简单介绍下着两个函数
LCD_ShowString(12,60,colors[0],colors[7],"-");应该是讲屏幕上x=12,y=60的地方显示一个“-”字符,字符颜色应该是你定义的colors[0],TFT屏的背景颜色是colors[7],这两个是你函数库自己定义的,可以改。
ChineseChar(20,60,1,colors[0],colors[7],1); //带 这个函数和上面那个函数大致相同,至于为什么会显示“带”,是因为最后那个1,这个程序你应该定义一个数组,在这个数组里面对你所要显示的字全部编码并存在这个数组中,最后你只需用想调用数组下标那样调用这个汉子。
至于你想显示班级、姓名 只需用把班级姓名进行编码就可以调用这个ChineseChar()函数进行显示
其实很简单的,只需用该几步就可以达到你想要的,不难~~

⑸ 单片机点阵8*8显示汉字程序解释

1. ORG 0HSTART:MOV DPTR,#DATA1 ;指向点阵代码首址;
CLR CDISP?这个应该是CLR C(清除标志位,因为下面要判断是否移完8位)吧

2. MOV R2,#80H ; 80H 使第7 列(最左一列)阴极为低电平(这个感觉也有问题)

3.DISP:MOV A,#0; 赋初值0,为了下面能从点阵代码表中从零开始取代码
MOVC A,@A+DPTR ; 取第一列点阵代码
MOV P2,A ; 将第一列点阵代码的值赋给P2口
MOV P1,R2 ;使一列阴极为低电平?
CALL DELAY ; 调用延时
INC DPTR ; 指向下一列点阵代码
MOV A,R2 ; R2的值赋给A
RRC A ; 右移一位,为下一列阴极输出低电平作准备
MOV R2,A ;右移一位后再把值存储到R2,为了下一次右移
JNC DISP ; 8 列未完跳回到DISP继续执行

4.AJMP START 跳转到START
DELAY: MOV R1,#0 ;//这个有问题,R1不是赋零,不然怎么延时啊
DELY0: DJNZ R1,DELY0 ;延时(直到R1的值变为0)

5.RET 返回(这个子程序执行完了)

6.DATA1: DB 24H,44H,DCH,54H,7FH,54H,54H,44H; 点阵代码表

大概就这个意思,好久没看汇编了,你自己再斟酌一下!

⑹ 求一个完整的单片机显示汉字程序

是用点阵式LED还是用LCD的?

这是液晶12864的显示程序
#include <reg51.h>

sbit RS=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit E=P2^0; // 读\写使能
sbit CS1=P2^4; // 片选1
sbit CS2=P2^3; // 片选2

unsigned int number=0,mstcnt=0; //number 控制显示的字符个数,mstcnt用于延时控制

unsigned char code ziku[]=

{
/* 此方法显示的汉字为下半列排,即先分为上下两半,然后先取上半部分的点阵数据,且点阵对应的数为从下看到上 D7~D0
/*-- 文字: 我 -- 采用下半列排的方式,送数的方式:它是显8*16后接着换下一页显下半8*16
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

/*-- 文字: 欢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,

/*-- 文字: 迎 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,

/*-- 文字: 大 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

/*-- 文字: 家 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6,0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00,
0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44,0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00,

/*-- 文字: 点 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x3F,0x24,0x24,0x24,0xF4,0x24,0x00,0x00,0x00,
0x00,0x40,0x30,0x07,0x12,0x62,0x02,0x0A,0x12,0x62,0x02,0x0F,0x10,0x60,0x00,0x00,

/*-- 文字: 击 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x88,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x88,0xC0,0x80,0x00,
0x00,0x00,0x00,0x7E,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7E,0x00,0x00,0x00,

/*-- 文字: 我 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,
0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00,

/*-- 文字: 的 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00,

/*-- 文字: 博 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0xFF,0x20,0x20,0x04,0xF4,0x54,0x54,0xFF,0x54,0x55,0xF6,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x04,0x04,0x0F,0x35,0x15,0x47,0x85,0x7F,0x07,0x04,0x04,0x00,

/*-- 文字: 客 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x18,0x04,0x84,0x44,0x7C,0xA5,0x26,0x24,0xA4,0x64,0x24,0x14,0x0C,0x04,0x00,
0x08,0x08,0x05,0x04,0xFC,0x46,0x46,0x45,0x45,0x46,0x46,0xFE,0x04,0x0C,0x04,0x00,

/*-- 文字: 谢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xCC,0x04,0x00,0xFC,0x56,0x55,0xFC,0x50,0x90,0x10,0xFF,0x10,0x10,0x00,
0x00,0x00,0x3F,0x50,0x29,0x11,0x4D,0x83,0x7F,0x00,0x41,0x80,0x7F,0x00,0x00,0x00,

/*-- 文字: 谢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xCC,0x04,0x00,0xFC,0x56,0x55,0xFC,0x50,0x90,0x10,0xFF,0x10,0x10,0x00,
0x00,0x00,0x3F,0x50,0x29,0x11,0x4D,0x83,0x7F,0x00,0x41,0x80,0x7F,0x00,0x00,0x00,

/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00,

/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,

};

checkstate() //状态检测(检查Busy)
{
unsigned char dat;
RS=0; //表示DB7~DBO为显示指令数据
RW=1; //数据被读到DB7~DBO
do
{
P1=0x00;
E=1; //E信号下降沿锁存DB7~DBO
dat=P1; //读入P1的值
E=0; //锁存
dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)为0时不忙
//BUSY:1内部在工作,0正常状态
}while(!(dat==0x00));
}
void writecommand(unsigned char command) //写命令
{
checkstate(); //检查Busy
RW=0;
P1=command;
E=1;
E=0;
}
void writedate(unsigned char date) //写数据
{
checkstate();
RS=1;
RW=0;
P1=date;
E=1;
E=0;
}
void cleanscreen() //清屏
{
unsigned char page,i;
for(page=0xb8;page<0xc0;page++) //共八页
{
writecommand(page); ///思路基本一样,从第一页写到最后一页
writecommand(0x40); ///数据指针 第一列开始
for(i=0;i<64;i++) ///0~63列
writedate(0x00);
}
}
void choosescreen(unsigned char NO) //选择屏幕 两屏
{
switch (NO)
{
case 0:
CS1=0;
CS2=0;
break; //不选,不显示
case 1:
CS1=0;
CS2=1;
break;
case 2:
CS1=1;
CS2=0;
break;
default:
break;
}
}

void lce_init(void)//初始化
{
writecommand(0xc0); //设置显示起始行
writecommand(0x3f);//显示开关控制
}

void display(unsigned char count) //显示
{
unsigned int i,m,page=0xb8; //0xb8设置设置页地址为第0页
choosescreen(1);
writecommand(0xb8);选择页面
writecommand(0x40);起始列
for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0)
m++;
switch (i) //控制显示的页指针与列指针
{
case 64: //显示的列累计求和 得所有左右屏四列的开始为 0.64 128.192 256.320 384.448
choosescreen(2); //右屏
writecommand(page); //字的上半部分 此显示方法与直接控制页显示类似,不过改进之处在于可逐字显示
writecommand(0x40); //设置起始列
break;
case 128:
choosescreen(1); //左屏
writecommand(page+2);
writecommand(0x40);
break;
case 192:
choosescreen(2);
writecommand(page+2);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(page+4);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(page+4);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(page+6);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(page+6);
writecommand(0x40);
break;
default:
break;
}
writedate(*(ziku+i+m*16));
}
choosescreen(1);
page=0xb9;
writecommand(page);
writecommand(0x40);
m=0;

/*
writecmd1(m); //上下循环显示
if(m==0xff)
{
m=0xc0;
}
m++;
writecmd2(n);
if(n==0xff)
{
n=0xc0;
}
n++;
*/

for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0)
m++;
switch (i) //控制显示的页指针与列指针
{
case 64: //显示的列累计求和
choosescreen(2); //右屏
writecommand(page); //字的下半部分
writecommand(0x40);
break;
case 128:
choosescreen(1); //左屏
writecommand(page+2);
writecommand(0x40);
break;

case 192:
choosescreen(2);
writecommand(page+2);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(page+4);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(page+4);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(page+6);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(page+6);
writecommand(0x40);
break;
default:
break;
}
writedate(*(ziku+i+m*16+16));
}
m=0;
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==2000)
{
mstcnt=0;
number++;
}
}
main()
{
TMOD=0x02;
TH0=0x06; //// 6650us定时中断
TL0=0x06;
TR0=1;
ET0=1;
EA=1;

E=1;

choosescreen(0);

cleanscreen();

lce_init();

while(1)
{
display(number);
if(number==33)
{
number=0;
choosescreen(0);
cleanscreen();
}
}

}

⑺ 单片机1616点阵显示汉字程序

首先要用取模软件,获得要显示的汉字的字模,每行两个字节,共32字节。然后单片机控制每次送一行的数据,并进行显示,轮流16次,再反复即可。

⑻ 单片机程序流程图如何写文字说明

单片机程序流程图用文字叙述如下:
上电,复位初始化,进入系统待机,如果没有传感器信号产生的中断就一直等待感器信号触发中断,如果有传感器信号发出中断则进入触发警报服务程序,等待停止警报按钮按下,解除警报,等待按下复位按钮对系统初始化再次进入系统,等待中断触发状态。
编程大概有80%精力放在流程图,剩下的就是用语言描述而已。所以编程最难的不是把代码写出来,而是把流程图画出来。有了流程图,编程就简单很多了。

阅读全文

与单片机汉字程序相关的资料

热点内容
内核驱动编译v1 浏览:574
韩国电影伦理中文 浏览:67
大乐透复式算法计算器 浏览:845
啄木鸟40部 浏览:502
我的世界服务器版本下载地址 浏览:925
怎么制作一个游戏的服务器 浏览:800
python中xticks用法 浏览:905
西瓜视频解压软心砖 浏览:137
程序员被孤立怎么办 浏览:807
主角秦风重生小说免费全文阅读 浏览:937
电影名卧布吉岛 浏览:161
泰国肉肉电影 浏览:499
电影无处可逃结局是什么 浏览:102
压缩性模量 浏览:352
平安老师讲解压力化解 浏览:459
快递员的电影是什么名字 浏览:780
日本电影叫什么鱼的名字 浏览:663
找书pdf 浏览:392
高水平应届程序员有前途吗 浏览:79
哪个视频网站可以投屏还免费 浏览:283