導航:首頁 > 操作系統 > 單片機漢字程序

單片機漢字程序

發布時間: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%精力放在流程圖,剩下的就是用語言描述而已。所以編程最難的不是把代碼寫出來,而是把流程圖畫出來。有了流程圖,編程就簡單很多了。

閱讀全文

與單片機漢字程序相關的資料

熱點內容
樂釣app怎麼寫出五星報告 瀏覽:625
類似團鬼六的電影有哪些 瀏覽:660
學校門口向右轉是電影院的英文 瀏覽:961
大樂透五行演算法 瀏覽:142
英語圖解pdf 瀏覽:612
智能租房系統源碼 瀏覽:346
c編程軟體哪個好 瀏覽:674
程序員寫什麼代碼最好 瀏覽:980
大尺度電影名字 瀏覽:897
重生民國收母 瀏覽:723
男主當鴨子的韓劇電影 瀏覽:488
人乳奶水電影 瀏覽:211
台灣鏡花風月系列 瀏覽:551
主角叫江辰的重生小說 瀏覽:608
李采潭演的都是真的嗎 瀏覽:512
日本女人切腹大尺度電影 瀏覽:637
vr電影在哪看 瀏覽:86
法國四級電影有哪些 瀏覽:558
男主角叫林楓得到系統的小說 瀏覽:820
pdf列印白邊 瀏覽:612