单片机我懂的不多,就跟不懂一样。。。。 但就软件编程这个角度我到可以提出我的想法
你不说有71个字是固定的,最后一个字从甲、乙、丙、丁里面随机选吗
那你在定义好了前71个字的数组后,可以定义一个二维数组,这二维数组里存放甲、乙、丙、丁
就像这样:
code unsigned char rndword[4][32]={{},{},{},{}};
我写点的地方你就写那些十六进制数字,这分别代表四个字
然后呢
你可能是先用一个循环把前71个字输出吧? 这我不管啥样。
反正到第72个字时,你要单独立出来来输出这个了随机数。
看代码:
int iRandom;
srand((unsigned)time(NULL)); // 这步是拿时间做随机数的种子
iRandom = rand()%4; //产生0到3的数,这个用来做二维数组的下标
然后你可能就用循环来输出了吧
for(j = 0 ; j < 32 ; j++)
{
//输出 rndword[iRandom][j]; 这看你单片机的咯
}
主要还是说下rand函数吧, 这要求你先拿一个东西做种子,一般都拿时间,就是srand是种子生成器,这样rand便能以时间做种子产生随机数了,之所以rand%4就是让它所产生的随机数除4取余,来得到0,1,2,3 来做数组下标用。 就这样
对了,忘了提醒,要加载
#include<stdlibh>
#include<timeh>
第一个头文件是srand 和rand函数的声明, 第二个是time函数的声明
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
#define outdat P2
sbit ld=P3^0;
sbit lw=P3^1;
//数码管显示代码
unsigned char code tab[]={
0x01,0x02,0x03,0x04,0xFF,0xFF,0xFF,0xFF};
void delay1ms(unsigned int count) //延时1ms
{
unsigned char j;
for(;count>0;count--)
for(j=0;j<120;j++);
}
void display(unsigned char num)
{
outdat=tab[num];
ld=0;ld=1;ld=0;
outdat=0x01<<num;
lw=0;lw=1;lw=0;
delay1ms(2);
}
void main()
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
display(i);
}
}
}
算法其实很简单,在不同时间片打入字模不同就可以实现
以下是伪代码
//
while(1)
{
for{打入字模}
delay(人眼可以识别的时间,不要太小,会出现鬼影)
}
library IEEE;
use IEEESTD_LOGIC_1164ALL;
use IEEESTD_LOGIC_ARITHALL;
use IEEESTD_LOGIC_UNSIGNEDALL;
ENTITY seg70 IS
PORT (
clk : IN std_logic; --clk 50MHZ
rst : IN std_logic; --REST
dataout : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出
en : OUT std_logic_vector(7 DOWNTO 0)); --COM使能输出
END seg70;
ARCHITECTURE arch OF seg70 IS
signal cnt_scan : std_logic_vector(15 downto 0 ); --计数器分频用
signal data4 : std_logic_vector(2 downto 0);
signal dataout_xhdl1 : std_logic_vector(7 downto 0);
signal en_xhdl : std_logic_vector(7 downto 0);
begin
dataout<=dataout_xhdl1;
en<=en_xhdl;
process(clk,rst)
begin
if(rst='0')then
cnt_scan<="0000000000000000";
elsif(clk'event and clk='1')then
cnt_scan<=cnt_scan+1; --计数器累加
end if;
end process;
process(cnt_scan(15 downto 13)) --计数器分频
begin
case cnt_scan(15 downto 13) is --这里有8种状态,一个状态的时间间隔是一样的。
when"000"=> en_xhdl<="11111110"; --每一次轮流选择一排点阵灯
when"001"=> en_xhdl<="11111101";
when"010"=> en_xhdl<="11111011";
when"011"=> en_xhdl<="11110111";
when"100"=> en_xhdl<="11101111";
when"101"=> en_xhdl<="11011111";
when"110"=> en_xhdl<="10111111";
when"111"=> en_xhdl<="01111111";
when others=> en_xhdl<="11111110";
end case;
end process;
process(en_xhdl)
begin
case en_xhdl is --每一选择一排灯,同时还要给点阵的数据端口送数据
when "11111110"=> data4<="000";
when "11111101"=> data4<="001";
when "11111011"=> data4<="010";
when "11110111"=> data4<="011";
when "11101111"=> data4<="100";
when "11011111"=> data4<="101";
when "10111111"=> data4<="110";
when "01111111"=> data4<="111";
when others => data4<="111";
end case;
end process;
process(data4)
begin
case data4 is
--给点阵的数据端口送数据
--点阵数据口对应的管脚为1时,那个点不会亮。
--当点阵数据口对应的管脚为0时,那个点会亮。
--下面是一个汉字“正”的点阵码,就是利用点阵的亮和不亮形成对比显示出来的。
WHEN "000" =>
dataout_xhdl1 <= "11111111"; --第一行
WHEN "001" =>
dataout_xhdl1 <= "00000000";
WHEN "010" =>
dataout_xhdl1 <= "11101011";
WHEN "011" =>
dataout_xhdl1 <= "10001011";
WHEN "100" =>
dataout_xhdl1 <= "11101011";
WHEN "101" =>
dataout_xhdl1 <= "11101111";
WHEN "110" =>
dataout_xhdl1 <= "10000001";
WHEN "111" =>
dataout_xhdl1 <= "11111111"; --第八行
WHEN OTHERS =>
dataout_xhdl1 <= "00000011";
END CASE;
END PROCESS;
end arch;
88 LED显示正字
你根据这个来改成0-F显示啊,程序看懂就行。再加个状态机,就可以顺序循环显示了
以上就是关于单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不全部的内容,包括:单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不、LED点阵程序、8×8LED点阵屏仿电梯数字滚动显示 c语言代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)