关于51单片机12864程序的问题

关于51单片机12864程序的问题,第1张

用这个吧。我以前用的

#include <reg52h>

#include<intrinsh>

#include <stringh>

#define uchar unsigned char

#define uint unsigned int

//8bit数据接入IO口

#define Part P0 //P0接8位数据线

//控制数据端

sbit LCD_RS=P3^2; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器

sbit LCD_RW=P1^1; //定义12864液晶RW端,读/写信号 H:读 L:写

sbit LCD_EN=P1^2; //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据

//sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行

sbit LCD_RST=P3^6; //定义12864液晶RST端, H:不复位 L:复位

sbit AD_ST=P1^6;//定义AD

sbit AD_OE=P3^7;

sbit AD_A=P1^3;

sbit AD_B=P1^4;

sbit AD_C=P1^5;

sbit AD_EOC=P1^7;

sfr T2MOD=0XC9;

uchar code dis1[]={"转速"};

uchar code dis2[]={"加速度x方向"};

uchar code dis3[]={"加速度y方向"};

uchar code dis4[]={"加速度z方向"};

uchar code Text[]={"欢迎大家观看"};

uint i;

uchar code dat[];

int jishu;

int sudu1;

int sudu2;

int maichong1;

int maichong2;

//毫秒延时函数

void delayms(uint x) //nms的延时

{

uint i;

while(x--)

{

for(i=0;i<125;i++)

{;}

}

}

void delay(uint xms)

{

uint i,j;

for(j=0;i<xms;j++)

for(i=0;i<110;i++);

}

//LCD忙检测函数

bit lcd_busy()

{

bit result;

LCD_RS=0;

LCD_RW=1;

LCD_EN= 1;

result=(bit)(Part & 0x80);

LCD_EN=0;

return result;

}

//液晶写命令函数

void lcd_write_cmd(uchar com)

{

while(lcd_busy());

LCD_RS=0; //选择指令寄存器

LCD_RW=0; //写

LCD_EN=0;

Part=com; //指令值赋给P0口

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

//液晶写一个字符数据函数

void lcd_write_dat(uchar date)

{

while(lcd_busy());

LCD_RS=1; //选择数据寄存器

LCD_RW=0; //写

LCD_EN=0;

P0=date; //数据值赋给P0口

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

//液晶写一个字符串函数

void lcd_write_string(uchar str)

{

while(str!='\0') //未结束

{

lcd_write_dat(str++);

delay(5);

}

}

//液晶显示位置函数

void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示

{

uchar pos;

if(x==1) //第一行

{x=0x80;}

else if(x==2) //第二行

{x=0x90;}

else if(x==3) //第三行

{x=0x88;}

else if(x==4) //第四行

{x=0x98;}

pos=x+y-1; //首地址为0X80

lcd_write_cmd(pos);

}

//液晶初始化函数

void lcd_init()

{

// LCD_PSB=1; //并行方式

LCD_RST=1; //不复位

lcd_write_cmd(0x30);

delay(5);

lcd_write_cmd(0x0c); //开显示,不显示光标

delay(5);

lcd_write_cmd(0x06); //写一个字符后地址指针自动加1

delay(5);

lcd_write_cmd(0x01); //清屏

delay(5);

}

/LCD12864显示程序

此程序控制LCD12864液晶屏,IC为KS0108或兼容型号

图形文件获取方法:

在字模提取V21软件中 ,导入一幅12864黑白图像

参数设置:

参数设置->其它选项,选择纵向取模,勾上字节倒序,保留逗号,

取模方式为C51。

将生成的数组通过keilc等C编译软件,在编译软件中新建一工程,写入源程序如下:

unsigned char code tab[]=

{

//图像数据

}

编译此工程将得到hex文件在QII中使用lpm_rom宏功能模块中调用此hex文件

/

module newlcd(clock,rst_n,rs,rw,en,data,lcd_cs);

// I/O口声明

input clock; //系统时钟

input rst_n; //复位信号

output[1:0] lcd_cs; //

output rs; //1:数据模式;0:指令模式

output rw; //1:读 *** 作;0:写 *** 作

output en; //使能信号,写 *** 作时在下降沿将数据送出;读 *** 作时保持高电平

output[7:0] data; //LCD数据总线

// I/O寄存器

reg rs;

reg en;

reg[1:0] lcd_cs;

reg[7:0] data;

//内部寄存器

reg[3:0] state; //状态机

reg[3:0] next_state;

reg[20:0] div_cnt; //分频计数器

reg[9:0] cnt; //写 *** 作计数器

reg cnt_rst; //写 *** 作计数器复位信号

wire[7:0] showdata; //要显示的数据

reg[1:0] cs_r;

reg [2:0] page_addr;

reg [5:0] row_addr;

//内部网线

wire clk_div; //分频时钟

wire clk_divs;

wire page_done; //写一行数据完成标志位

wire frame_done; //写一屏数据完成标志位

wire left_done;

//状态机参数

parameter idle =4'b0000,

setbase_1 =4'b0001,

setbase_2 =4'b0011,

setmode_1 =4'b0010,

setmode_2 =4'b0110,

SETpage_addr_1 =4'b0111,

SETpage_addr_2 =4'b0101,

SETrow_addr_1 =4'b1101,

SETrow_addr_2 =4'b1111,

write_right_1 =4'b1110,

write_right_2 =4'b1010,

write_nextpage_1 =4'b1011,

write_nextpage_2 =4'b1001,

wr_data_1 =4'b0100,

wr_data_2 =4'b1100;

// set_1 =4'b1000;

//代码开始

assign rw = 1'b0; //对LCD始终为写 *** 作

//时钟分频

always@(posedge clock or negedge rst_n)

begin

if(!rst_n)

div_cnt <= 0;

else

div_cnt <= div_cnt+1'b1;

end

assign clk_div = (div_cnt[15:0] == 20'h7fff);

//状态机转向

always@(posedge clock or negedge rst_n)

begin

if(! rst_n)

state <= idle;

else if(clk_div)

state <= next_state;

end

//状态机逻辑

always@(state or page_done or left_done or frame_done or cnt or showdata or page_addr or row_addr or cs_r)

begin

rs <= 1'b0;

en <= 1'b0;

lcd_cs <= cs_r;

cnt_rst <= 1'b0;

data <= 8'h0;

case(state)

idle:

begin

next_state <= setbase_1;

cnt_rst <= 1'b1;

end

//初始化LCD

setbase_1: //基本指令 *** 作

begin

lcd_cs <= 2'b11;

next_state <= setbase_2;

data <= 8'hc0;

en <= 1'b1;

end

setbase_2:

begin

lcd_cs <= 2'b11;

next_state <= setmode_1;

data <= 8'hc0;

end

//

setmode_1:

begin

lcd_cs <= 2'b11;

next_state <= setmode_2;

data <= 8'h3f;

en <=1'b1;

end

setmode_2:

begin

next_state <= SETpage_addr_1;

data <= 8'h3f;

end

//

SETpage_addr_1: //设置页地址

begin

next_state <= SETpage_addr_2;

data <= ;

en <= 1'b1;

end

SETpage_addr_2:

begin

next_state <= SETrow_addr_1;

data <= ;

end

SETrow_addr_1: //设置列地址

begin

next_state <= SETrow_addr_2;

data <= ;

en <= 1'b1;

end

SETrow_addr_2:

begin

next_state <= wr_data_1;

data <= ;

end

//

/

write_right_1: //写完左半屏64个,换为右半屏显示

begin

next_state <=write_right_2;

row_addr <= 0;

end

write_right_2:

begin

next_state <= SETpage_addr_1;

end

//

write_nextpage_1: //写完全一行128个

begin

next_state <=write_nextpage_2;

row_addr <= 0;

end

write_nextpage_2:

begin

next_state <= SETpage_addr_1;

end

/

//

wr_data_1: //写数据到图形显示区

begin

next_state <= wr_data_2;

rs <= 1'b1;

en <= 1'b1;

data <= showdata;

end

wr_data_2:

begin

rs <= 1'b1;

data <= showdata;

if(left_done) //写完左半屏数据64个

begin

if(page_done) //写完一页数据128个

begin

if(frame_done) //写完一屏数据(8页)

next_state <= idle;

else

// next_state <= write_nextpage_1;

next_state <= SETpage_addr_1;

end

else

// next_state <= write_right_1;

next_state <= SETpage_addr_1;

end

else

next_state <= wr_data_1;

end

default: next_state <= idle;

endcase

end

//

always@(posedge clock)

begin

if(clk_div)

begin

if(cnt_rst)

begin

cnt <= 0;

end

else if(state == wr_data_2)

begin

cnt <= cnt+1'b1;

end

end

end

//

always@(posedge clock or negedge rst_n)

if(!rst_n)

begin

cs_r <= 2'b01;

page_addr <= 0;

end

else

if(clk_div && (state == wr_data_2))

if(page_done)//

begin

cs_r <= 2'b01;

page_addr <= page_addr + 1'b1;//一页写完时写下一页

end

else

if(left_done)

begin

cs_r <= 2'b10;

end

//

//

assign left_done = (cnt[5:0] == 6'd63); //写完左半屏数据64个

assign page_done = (cnt[6:0] == 7'd127); //写完一页数据128个

assign frame_done = (cnt[9:4] == 7'h3f); //写完一屏数据

//

//

//调用ROM(数据)

rom rom(address(cnt+'d8),clock(clock),q(showdata));

endmodule

开发板例程 自己看吧

我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

#include<spce061ah>

#include<bith>

#define lcd_sclk P0_8

#define lcd_sid P0_9

void byte_write(char a)

{

char b;

lcd_sid=0;

lcd_sclk=0;

for(b=0;b<8;b++)

{

if(a&0x0080)

lcd_sid=1;

else

lcd_sid=0;

lcd_sclk=0;

lcd_sclk=1;

a=a<<1;

P_Watchdog_Clear=0x0001;

}

}

void command(char i) //写指令

{

char a,b;

a=0xf8;

byte_write(a);

b=i&0x00f0;

byte_write(b);

b=i&0x000f;

b=b<<4;

byte_write(b);

}

void data(char i) //写数据

{

char a,b;

a=0xfa;

byte_write(a);

b=i&0x00f0;

byte_write(b);

b=i&0x000f;

b=b<<4;

byte_write(b);

}

void init() //初始化

{

command(0x38);

command(12);

command(0x01);

command(0x06);

command(0x80);

}

main()

{

char a;

char sj[]="恭喜串口测试成功";

P_IOA_Dir=0xffff;//对a口初始化设置为低电平输出

P_IOA_Attrib=0xffff;

P_IOA_Data=0xffff;

init();

for(a=0;a<16;a++)

data(sj[a]);

while(1)

P_Watchdog_Clear=0x0001 ;

// dely(1);

}

这个是凌阳61的12864液晶串口驱动。但初始化与写指令,写数据的函数可以移植调用。

//1062液晶双行显示

// bravey 1127

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit en=P2^7; //这些管脚要看原理图的,或许我的单片机和你的不一样。

sbit rs=P2^6;

sbit rw=P2^5;

uchar code d1[]={填入你要现实的字的码值,用取模软件 };

uchar code d2[]={填入你要现实的字的码值,用取模软件 };

void delay(uint z)//延迟函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=0;y<110;y++);

}

void write_com(uchar com) //送地址函数定义

{

rs=0;

rw=0;

P0=com;

delay(5);

en=1;

delay(5);

en=0;

}

void write_datt(uchar datt) //送数据

{

rs=1;

rw=0;

P0=datt;

delay(5);

en=1;

delay(5);

en=0;

}

void lcd_init() //初始化

{

en=0;

write_com(0x0c);//整体显示,无光标,不反白

write_com(0x07);//地址指针加一设置,且整体左移

write_com(0x01);//清屏

}

void main()

{

uchar i;

lcd_init();

write_com(0x80);//地址指针初始化,第一行显示拼音名字

for(i=0;i<13;i++)

{

write_datt(d1[i]);

delay(20);

}

write_com(0x90);

for(i=0;i<9;i++)

{

write_datt(d1[i]);//高位

write_datt(d2[i]);//低位

delay(20);

}

while(1);

}

这是一个简单的12864显示字的程序。LZ可以参考参考

检查液晶屏控制器的时序 *** 作命令码初始化过程,还有硬件,上下拉电阻,既然决定用并口,那么PSB就直接VDD,这样还能省一个IO口 注意下面的程序中RS=0,RW=0,能同时为低吗 void write_command(uchar cmd)

{

check_busy();

rs=0;

rw=0;

en=0;

P2=cmd;

delay_4us();

en=1;

delay_4us();

en=0;

}

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit CS=P2^5; //片选信号

sbit SID=P2^6; //数据信号

sbit SCLK=P2^7; //时钟信号

sbit RST=P2^2; //复位信号

sbit CH = P2^4; //并行、串行选择信号

/

名称 : delay()

功能 : 延时,延时时间为 100us t。这是通过软件延时,有一定误差。

输入 : t

输出 : 无

/

void delay(unsigned int t)

{

unsigned int i,j;

for(i=0; i<t; i++)

for(j=0; j<10; j++);

}

/

名称 : sendbyte()

功能 : 按照液晶的串口通信协议,发送数据

输入 : zdata

输出 : 无

/

void sendbyte(unsigned char zdata)

{

unsigned int i;

for(i=0; i<8; i++)

{

if((zdata << i) & 0x80)

{

SID = 1;

}

else

{

SID = 0;

}

SCLK = 0;

SCLK = 1;

}

}

/

名称 : write_com()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_com(unsigned char cmdcode)

{

CS = 1;

sendbyte(0xf8);

sendbyte(cmdcode & 0xf0);

sendbyte((cmdcode << 4) & 0xf0);

delay(2);

}

/

名称 : write_data()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_data(unsigned char Dispdata)

{

CS = 1;

sendbyte(0xfa);

sendbyte(Dispdata & 0xf0);

sendbyte((Dispdata << 4) & 0xf0);

delay(2);

}

/

名称 : lcdinit()

功能 : 初始化函数

输入 : cmdcode

输出 : 无

/

void lcdinit()

{

RST = 0;

delay(100);

RST = 1;

delay(20000);

write_com(0x30);

delay(50);

write_com(0x0c);

delay(50);

}

/

名称 : hzkdis()

功能 : 显示字符串

输入 : s

输出 : 无

/

void hzkdis(unsigned char code s)

{

while(s > 0)

{

write_data(s);

s++;

delay(50);

}

}

/

名称 : Test()

功能 : 显示子函数

输入 : 无

输出 : 无

/

void Test()

{

write_com(0x03);

delay(50);

write_com(0x81);

hzkdis(" HOT-51");

write_com(0x91);

hzkdis("单片机开发板");

write_com(0x89);

hzkdis(" ");

write_com(0x98);

hzkdis(" 东流电子");

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void Main()

{

CH = 0;

delay(1);

lcdinit();

delay(10);

while(1)

{

Test();

delay(5000);

}

}

不知道是不是吴鉴鹰开发板售后不好啊,所以你才来问。

1、红外线基本 每一个遥控器都可以接受,只不过编码方式不一样。

2、解码就是姨译码过程,比如现在发送0x12,代表是字符“A”。

3、完全可以的只要通过单片机写程序就可以了。

以上就是关于关于51单片机12864程序的问题全部的内容,包括:关于51单片机12864程序的问题、用FPGA编写12864显示的程序,跪求。。。可以显示就行,内容可以是字母。。谢谢、12864液晶程序流程图给一份吧等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10082312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存