1

帖子

0

TA的资源

一粒金砂(初级)

41
 
汉字怎么显示???用查表的方式吗?
此帖出自FPGA/CPLD论坛

点评

这个是直接查国标码写在代码里的,可以使用查表的方式,这个屏幕是有字库的,不过qii并不支持把汉字转换成国标码的功能  详情 回复 发表于 2016-7-26 20:26
 

回复

288

帖子

0

TA的资源

一粒金砂(高级)

42
 
很好很强大,感谢楼主的分享
此帖出自FPGA/CPLD论坛
 
 

回复

6419

帖子

17

TA的资源

版主

43
 
diyxue 发表于 2016-7-26 16:31
汉字怎么显示???用查表的方式吗?

这个是直接查国标码写在代码里的,可以使用查表的方式,这个屏幕是有字库的,不过qii并不支持把汉字转换成国标码的功能
此帖出自FPGA/CPLD论坛
个人签名training
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

44
 
非常好。非常感谢
此帖出自FPGA/CPLD论坛
个人签名[ 我该怎么感谢你们这些陪我那么久却从不喊累的人]
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

45
 
怎么没有PSB管脚啊
此帖出自FPGA/CPLD论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

46
 
版主 你好 我是FPGA的萌新一枚  斗胆不才根据你的程序进行改编了一下,想做一个键盘控制12864显示,但是发现,但键盘摁下6和7 时  12864就会出现花屏的情况。 能帮忙看一下是那边出的问题吗  下面附有我改的代码

module lcd(//针对型号为RT12864-S  
                        input Sys_Clk,  
                        input Rst,
                        input down,
                        input right,
                        input data_in,
                        input clear,
                        input [7:0] data,
                        output reg LCD_RS,  
                        output LCD_RW,  
                        output LCD_E,
                        output LCD_psb,         
                        output LCD_Rst,       
                        output [7:0]lcd_data  
//      output PSB//串并控制端口,H为并行,L为串行,直接接5v  
//      output LCD_Rst,//液晶的复位端口,低电平有效  
//由于端口不够,暂时让其悬空  
                        );  
assign lcd_data = lcd_data_out;
reg [7:0] lcd_data_out;
reg LCD_Clk;  
reg[7:0] state;//状态机寄存器  
reg [23:0] cnt;//计数器  
reg flag;//显示完成标志  
reg[5:0]char_cnt;  
reg[7:0]data_disp;//一个字节是八位,一个英文字符是一个字节,中文是俩个字节  
reg [2:0] x;
reg [3:0] y;
parameter T500KHZ=24'd12287;  
//  parameter T500KHZ=24'd24_999_999;//测试低频现象  
//  parameter T500KHZ=24'd24_9;//仿真专用  
//首先先对系统频率分频,液晶所需频率不用这么高,但是是多少呢?由datasheet可得出该液晶的最大频率是590kHZ  
//典型值为530KH,为了好算取个值500KHZ,50M/500KHZ=10HZ,计数5M/2变化一次方向  
assign LCD_psb = 1'b1;
assign LCD_Rst = 1'b1;
always@(posedge Sys_Clk or negedge Rst)  
begin  
        if(!Rst)  begin  
                cnt<=24'd0;  
                LCD_Clk<=1'b0;  
        end  
        else if(cnt==T500KHZ)  begin  
                cnt<=24'd0;  
                LCD_Clk<=~LCD_Clk;  
        end  
        else  
                cnt<=cnt+1'b1;  
end  
       
reg down_delay;
reg right_delay;
reg data_in_delay;
reg clear_delay;
reg down1;
reg right1;
reg data_in1;
reg clear1;

wire down_rise;
wire right_rise;
wire data_in_rise;
wire clear_rise;
always@(posedge Sys_Clk or negedge Rst)  
begin
        if (Rst == 1'b0)
        begin
                down1 <= 1'b0;
                right1   <= 1'b0;
                data_in1                <= 1'b0;
                clear1                <= 1'b0;
        end
        else
        begin
                down1 <= down;
                right1   <= right;
                data_in1     <= data_in;
                clear1 <= clear;
        end
end
assign down_rise = (down == 1'b1) && (down1 == 1'b0);
assign right_rise = (right == 1'b1) && (right1 == 1'b0);
assign data_in_rise = (data_in == 1'b1) && (data_in1 == 1'b0);
assign clear_rise = (clear == 1'b1) && (clear1 == 1'b0);

always@(posedge Sys_Clk or negedge Rst)  
begin  
        if(!Rst)  begin   
                down_delay<=1'b0;  
        end  
        else if(down_rise==1'b1)
                down_delay<=1'b1;  
        else if(state != IDLE)
                down_delay<=1'b0;
        else
                down_delay<=down_delay;  
end
always@(posedge Sys_Clk or negedge Rst)  
begin  
        if(!Rst)  begin   
                right_delay<=1'b0;  
        end  
        else if(right_rise==1'b1)
                right_delay<=1'b1;  
        else if(state != IDLE)
                right_delay<=1'b0;
        else
                right_delay<=right_delay;  
end
always@(posedge Sys_Clk or negedge Rst)  
begin  
        if(!Rst)  begin   
                data_in_delay<=1'b0;  
        end  
        else if(data_in_rise==1'b1)
                data_in_delay<=1'b1;  
        else if(state != IDLE)
                data_in_delay<=1'b0;
        else
                data_in_delay<=data_in_delay;  
end  

always@(posedge Sys_Clk or negedge Rst)  
begin  
        if(!Rst)  begin   
                clear_delay<=1'b0;  
        end  
        else if(clear_rise==1'b1)
                clear_delay<=1'b1;  
        else if(state != IDLE)
                clear_delay<=1'b0;
        else
                clear_delay<=clear_delay;  
end
//state machine description,8个状态 只要用把位二进制就可以全部表示  
parameter IDLE=8'b00_000_000;//初始状态  
parameter SETFUNCTION=8'b00_000_001;//功能设置,8-bit+基本指令集0x30  
parameter SETFUNCTION2=8'b00_000_010;//同上  
parameter SWITCHMODE=8'b00_000_100;//设置显示开和光标闪烁关闭  
parameter CLEAR=8'b00_001_000;//清屏操作  
parameter SETMODE=8'b00_010_000;//点设置  
parameter SETDDRAM=8'b00_100_000;//起始行设置  
parameter WRITERAM=8'b01_000_000;//写设置  
parameter STOP=8'b10_000_000;//LCD操作停止,释放其控制  
parameter POWERUP =8'b00_000_011;//初始状态
       
//设置好RS、RW、E  
always@(posedge LCD_Clk or negedge Rst)  
begin  
        if(!Rst)  
                LCD_RS<=1'b0;  
        else if(state==WRITERAM)  
                LCD_RS<=1'b1;  
         else  
                LCD_RS<=1'b0;  
end  
       
//如果定义了LCD_Rst俩个端口的话,可做如下设置  
//assign LCD_Rst=1'b1;  
//assign PSB=1'b1;  
assign LCD_RW=1'b0;//只是写操作,不需要读操作  
assign LCD_E=(flag==1)?LCD_Clk:1'b0;//使能信号与液晶时钟同步  
       
//descible the state machine  
always@(posedge LCD_Clk or negedge Rst)  
begin  
        if(!Rst)  begin  
                state<=POWERUP;  
                lcd_data_out<=8'bzz_zzz_zzz;
                x <= 3'b1;
                y <= 4'b0;
                flag<=1'b1;
         end  
        else  begin  
                case(state)  
                        POWERUP:  begin  
                                 state<=SETFUNCTION;  
                                 lcd_data_out<=8'h30;
                                 flag<=1'b1;
                        end  
                        IDLE:  begin   
                                 flag<=1'b1;
                                 if(down_delay == 1'b1) begin
                                        if(x == 3'd4)
                                                x <= 3'b1;
                                        else
                                                x <= x +3'b1;
                                        state <= SETDDRAM;
                                 end
                                 else if(right_delay == 1'b1) begin
                                        state <= SETDDRAM;
                                        y <= y +4'b1;
                                        if((x == 3'd4) &&(y == 4'd15))
                                                x <= 3'd1;
                                        else if(y == 4'd15)
                                                x <= x +3'b1;
                                        else
                                                x <= x;
                                end
                                else if(data_in_delay == 1'b1) begin
                                        state <= WRITERAM;
                                        y <= y +4'b1;
                                        if((x == 3'd4) &&(y == 4'd15))
                                                x <= 3'd1;
                                        else if(y == 4'd15)
                                                x <= x +3'b1;
                                        else
                                                x <= x;
                                end
                                else if(clear_delay == 1'b1) begin
                                        state<=SETFUNCTION;  
                                        lcd_data_out<=8'h30;
                                        flag<=1'b1;
                                        x <= 1;
                                        y <= 0;
                                end
                                else begin
                                        x <= x;
                                        y <= y;
                                end
                        end
                        SETFUNCTION: begin  
                                state<=SWITCHMODE;  
                                state<=SETFUNCTION2;  
                                lcd_data_out<=8'h30;  
                        end  
                        SETFUNCTION2:begin     
                                state<=SWITCHMODE;  
                                lcd_data_out<=8'h30;  
                        end  
                        SWITCHMODE:begin  
                                state<=CLEAR;  
                                lcd_data_out<=8'h0f;//显示设置,全显示开,光标和闪烁关  
                        end  
                        CLEAR:begin  
                                state<=SETMODE;  
                                lcd_data_out<=8'h01;//清屏、  
                        end  
                        SETMODE: begin  
                                state<=SETDDRAM;  
                                lcd_data_out<=8'h06;//点设置,光标右移,地址加一,整体不动  
                        end  
                        SETDDRAM: begin //设置起始位置  
                                state<=IDLE;  
                                if(x==3'd1)  
                                        lcd_data_out<=8'h80 +y;//line1  
                                else  if(x==3'd2)
                                        lcd_data_out<=8'h90 +y;//line2
                                else  if(x==3'd3)
                                        lcd_data_out<=8'h88 +y;//line3
                                else  if(x==3'd4)
                                        lcd_data_out<=8'h98 +y;//line4
                                else
                                        lcd_data_out<=8'h80;
                        end  
                        WRITERAM: begin   
                                lcd_data_out <= data;  
                                if(y==4'b0)
                                        state <= SETMODE;
                                else
                                        state <= IDLE;
                        end  
                        STOP:   state<=IDLE;  
                        default: state<=IDLE;  
                endcase  
        end   
                                 
end  
always@(char_cnt)  
begin  
                        case(char_cnt)  
                                 6'd0:data_disp="G";  
                                 6'd1:data_disp="U";  
                                 6'd2:data_disp="X";  
                                 6'd3:data_disp="I";  
                                 6'd4:data_disp="A";  
                                 6'd5:data_disp="N";  
                                 6'd6:data_disp="Y";  
                                 6'd7:data_disp="I";  
                                 6'd8:data_disp="L";  
                                 6'd9:data_disp="C";  
                                 6'd10:data_disp="D";  
                                 6'd11:data_disp="!";  
                                       
                                 6'd12:data_disp="H";  
                                 6'd13:data_disp="E";  
                                 6'd14:data_disp="L";  
                                 6'd15:data_disp="L";  
                                 6'd16:data_disp="O";  
                                 6'd17:data_disp="E";  
                                 6'd18:data_disp="V";  
                                 6'd19:data_disp="E";  
                                 6'd20:data_disp="R";  
                                 6'd21:data_disp="Y";  
                                 6'd22:data_disp="O";  
                                 6'd23:data_disp="N";  
                                 6'd24:data_disp="E";  
          //      default:data_disp=8'h32;  
                        endcase  
                          
end  
       
endmodule
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

47
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

48
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

49
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

50
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

51
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

52
 
PuesueDream 发表于 2015-7-22 18:52
好东西,待会试试  看看能不能我的板子用。最近几天忙了好久的FPGA驱动12864,但是不知怎么的编译通过了, ...

看看PSB 接了没有
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表